// 这个文件专门用来做权限拦截处理的：写在导航守卫中
// 1.0 导入 router 对象
import router from '@/router/index'
// 导入 store
import store from '@/store/index'
// 导入进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
// 创建一个白名单(不需要登录就可以直接访问的路由)
const WRITE_LIST = ['/404', '/login']

// 2.0 给 router 设置导航守卫
// 2.1 设置前置守卫（触发时机：进入页面之前会触发）
router.beforeEach(async (to, from, next) => {
  // 开启进度条
  NProgress.start()
  // to：去的路由
  // from：来的路由
  // next：函数，决定是否向下执行的函数
  // 3.0 判断是否存在 token
  // 3.1 得到 token
  const token = store.getters.token
  // 3.2 判断
  if (token) {
    // 存在
    // 判断访问的是否是登录页面
    if (to.path === '/login') {
      // 跳转到主页
      next('/')
      // 在关闭进度条
      NProgress.done()
    } else {
      // 获取用户信息
      await store.dispatch('user/getUserInfo')
      next()
    }
  } else {
    // 不存在
    // 判断访问的页面是否在白名单中
    //    includes: 数组的一个方法，用来判断在数组中是否存在某个元素。如果存在返回 true, 如果不存在返回 false
    if (WRITE_LIST.includes(to.path)) {
      // 在白名单中存在
      next()
    } else {
      // 在白名单中不存在
      // 我们应该将此时访问的路径记录下来
      next(`/login?_redirect=${to.path}`)
    }
  }
})

// 后置 守卫(进入路由之后会触发)
router.afterEach(() => {
  // to:去的路由
  // from:来的路由
  // 关闭进度条
  NProgress.done()
})
